package leetcode.editor.cn.dsa17_traversal;
// 给定一个二叉树和一个目标和，判断该树中是否存在根节点到叶子节点的路径，这条路径上所有节点值相加等于目标和。
//
// 说明: 叶子节点是指没有子节点的节点。
//
// 示例: 
// 给定如下二叉树，以及目标和 sum = 22，
//               5
//             / \
//            4   8
//           /   / \
//          11  13  4
//         /  \      \
//        7    2      1
// 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
//
// Related Topics 树 深度优先搜索 
// 👍 484 👎 0

public class PathSum112 {
    //leetcode submit region begin(Prohibit modification and deletion)
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
    class Solution {
        public boolean hasPathSum(TreeNode root, int sum) {
            int ret = 0;
            return getPathSum(root, ret, sum); // 深度优先遍历
        }

        private boolean getPathSum(TreeNode root, int sum, int target) {
            if (root == null) return false; // 当遍历到空节点，结果无效
            sum += root.val; // 累加节点值
            // 当遍历到叶子节点，说明此条路径结束。比较此时的总和和目标值是否相等
            if (root.left == null && root.right == null) return sum == target;
            // 非叶子节点，有两条路径，往左子树递归遍历或者往右子树递归遍历
            // 任何一条路径返回true则为true
            return getPathSum(root.left, sum, target) || getPathSum(root.right, sum, target);
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
}